#pragma once
#include <stdint.h>
typedef uint8_t  U8;
typedef uint16_t U16;
typedef uint32_t U32;
typedef uint64_t U64;
typedef int8_t   S8;
typedef int16_t  S16;
typedef int32_t  S32;
typedef int64_t  S64;
#include <USD64.h>
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
union LSU {
   U64 l;
   double d;
   struct {
      S32 hi;
      S32 lo;
   } s;
};
struct LSU2X {
   LSU l;
   LSU r;
};
union PLS {
   U32 * ps;
   U64 * pl;
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
union ONode {
public:
   U64 l[4];
   double d[4];
   U32 s[8];
};
union QNode {
public:
   U64 l[2];
   double d[2];
   U32 s[4];
};
union BNode {
   U64 l[1];
   double d[1];
   U32 s[2];
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
inline void ZeroNode( BNode & n ) { n.l[0] = 0ULL; }
inline void ZeroNode( QNode & n ) { n.l[0] = 0ULL; n.l[1] = 0ULL; }
inline void ZeroNode( ONode & n ) { n.l[0] = 0ULL; n.l[1] = 0ULL; n.l[2] = 0ULL; n.l[3] = 0ULL; }
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
inline bool operator == ( const BNode & a, const BNode & b ) {
   if( a.l[0] ^ b.l[0] ) { return false; }
   return true;
}
inline bool operator == ( const QNode & a, const QNode & b ) {
   if( a.l[0] ^ b.l[0] ) { return false; }
   if( a.l[1] ^ b.l[1] ) { return false; }
   return true;
}
inline bool operator == ( const ONode & a, const ONode & b ) {
   if( a.l[0] ^ b.l[0] ) { return false; }
   if( a.l[1] ^ b.l[1] ) { return false; }
   if( a.l[2] ^ b.l[2] ) { return false; }
   if( a.l[3] ^ b.l[3] ) { return false; }
   return true;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
inline bool operator  < ( const BNode & a, const BNode & b ) {
   if( a.l[0] < b.l[0] ) return true;
   return false;
}
inline bool operator  < ( const QNode & a, const QNode & b ) {
   if( a.l[0] < b.l[0] ) return true;
   if( a.l[0] == b.l[0] )
     if( a.l[1] < b.l[1] ) return true;
   return false;
}
inline bool operator  < ( const ONode & a, const ONode & b ) {
   if( a.l[0]  < b.l[0] ) return true;
   if( a.l[0] == b.l[0] ) {
      if( a.l[1]  < b.l[1] ) return true;
      if( a.l[1] == b.l[1] ) {
         if( a.l[2]  < b.l[2] ) return true;
         if( a.l[2] == b.l[2] ) {
            if( a.l[3] < b.l[3] ) return true;
         }
      }
   }
   return false;
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
